#include "linkList.h"
void maopao();
void selectsort(int num[], int n);
// 单链表初始化
LinkList linkListCreate()
{
    LinkList head = NULL;
    head = (LinkList)malloc(sizeof(LinkList));
    if (head == NULL)
    {
        printf("内存分配失败");
        return NULL;
    }
    head->next = NULL;
    head->data = 0;
    return head;
}

// 销毁
LinkList list_free(LinkList H)
{
    while (H->next != NULL)
    {
        LinkList temp = H->next;
        H->next = temp->next;
        free(temp);
    }
    free(H);
}

// 头插
int list_head_insert(LinkList H, Data_type value)
{
    printf("头插\n");
    // 创建一个节点
    LinkList node = (LinkList)malloc(sizeof(LinkList));
    node->data = value;
    // 备份下一个节点
    LinkList tem = H->next;
    node->next = tem;
    H->next = node;
}
// 修改
int list_changt(LinkList H, Data_type value, Data_type newValue)
{
    // 复制一个头
    LinkList tem = H;
    // 遍历单链表，直到地址位为NULL
    while (tem)
    {
        if (tem->data == value)
        {
            tem->data = newValue;
        }
        // 将链表节点赋值给中间量
        tem = tem->next;
    }
}

// 尾部插入一个数据
int list_tail_insert(LinkList H, Data_type value)
{
    // 复制一个头
    LinkList tem = H;
    // 创建一个节点
    LinkList newNode = (LinkList)malloc(sizeof(LinkList));
    newNode->data = value;
    // 遍历单链表，直到地址位为NULL
    while (tem->next != NULL)
    {
        // 将链表节点赋值给中间量
        tem = tem->next;
    }
    tem->next = newNode;
    return 0;
}

// 遍历链表
void list_show(LinkList H)
{
    // 复制一个头
    LinkList tem = H->next;
    printf("遍历链表\n");
    while (tem)
    {
        printf("%d\t", tem->data);
        // 将链表节点赋值给中间量
        tem = tem->next;
    }
    printf("\n");
}

// 反转链表
LinkList list_reverse(LinkList H)
{
    if (H == NULL || H->next == NULL)
    {
        // 空链表或单节点链表直接返回
        return H;
    }
    LinkList pNode = H->next->next;
    LinkList qNode = NULL;
    // 判断最后一个的地址是否为null
    H->next->next = NULL; // 将第一个节点的next指向NULL,作为结尾用
    while (pNode != NULL)
    {
        qNode = pNode;       // 往前挪节点前，备份，防止后续数据丢失
        pNode = pNode->next; // 往后走
        qNode->next = H->next;
        H->next = qNode;
    }
}

// 查找节点
LinkList list_get(LinkList H, int pos)
{
    printf("pos is %d\n", pos);
    LinkList head = H;
    LinkList node = NULL;
    int i = 0;
    while (head)
    {
        if (i == pos)
        {
            node = head;
        }
        head = head->next;
        i++;
    }
    return node;
}

void main()
{
    LinkList head = linkListCreate();
    list_tail_insert(head, 1);
    list_tail_insert(head, 26987);
    list_tail_insert(head, 23);
    // list_tail_insert(head, 3);
    // list_tail_insert(head, 4);
    // list_tail_insert(head, 5);
    list_show(head);
    // LinkList node = list_get(head, 3);
    // list_head_insert(head, 96357);
    // list_changt(head, 23, 666);
    list_free(head);
    list_show(head);
    // list_reverse(head);
    // list_show(head);
}

// 删除链表第pos个结点
int list_delete(LinkList H, int pos)
{
    LinkList tempNode;
    if (H == NULL)
    {
        printf("H is NULL\n");
        return -1;
    }
    // 1.找到第pos个结点的前驱
    tempNode = list_get(H, pos - 1);
    if (tempNode == NULL)
    {
        return -1;
    }
    // 注意：一种情况 可能当前前驱结点就是最后一个结点
    if (tempNode->next == NULL)
    {
        printf("delete pos is invaild\n");
        return -1;
    }
    // 2.更正链表   先存储待删除结点 然后再将前驱结点指向后继结点
    LinkList t = tempNode->next; // 用t存储待删除点
    tempNode->next = tempNode->next->next;
    // 3.释放
    free(t);
    t = NULL;
    return 0;
}